﻿#ifndef _USB5630_DEVICE_
#define _USB5630_DEVICE_

#include "windows.h" 

// #################### 人性化的数据类型定义 #####################
// Humanized data types definition
#ifndef _HUMAN_DATA_TYPE_
#define _HUMAN_DATA_TYPE_
typedef char				I8;		// 8位有符号整型数据
typedef unsigned char		U8;		// 8位无符号整型数据
typedef short				I16;	// 16位有符号整型数据
typedef unsigned short		U16;	// 16位无符号整型数据
typedef long				I32;	// 32位有符号整型数据
typedef unsigned long		U32;	// 32位无符号整型数据
typedef __int64				I64;	// 64位有符号整型数据
typedef unsigned __int64	U64;	// 64位无符号整型数据
typedef float				F32;	// 32位浮点数据(单精度，同为labVIEW中的SGL)
typedef double				F64;	// 64位浮点数据(双精度，同为labVIEW中的DBL)
#endif // _HUMAN_DATA_TYPE_

// ########################## 设备功能指标 ########################
#define USB5630_AI_MAX_CHANNELS		64	// 本卡最多支持64路模拟量单端输入通道
#define USB5630_AO_MAX_CHANNELS		4	// 本卡最多支持4个模拟量输出通道
#define USB5630_DIO_MAX_PORTS		3	// 本卡最多支持3个数字量端口
#define USB5630_DIO_PORT0_MAX_LINES	8	// 数字量端口0支持8条线输入\输出，方向可控
#define USB5630_DIO_PORT1_MAX_LINES	8	// 数字量端口1支持8条线输入\输出，方向可控
#define USB5630_DIO_PORT2_MAX_LINES	8	// 数字量端口2支持8条线输入\输出，方向可控


//-----------------------------------
// ############# 端口参数结构体USB5630_PORT_CH_PARAM描述 #############
typedef struct _USB5630_PORT_CH_PARAM // IO端口通道参数结构体
{
	U32 nFunction[8];		// 端口下各通道功能选择,端口0只能为DIo,请参考下面常量定义
	U32 nDIODir[8];			// DIo方向,当nFunction=0时起作用
	U32 nDIOVal[8];			// DIO方向为输出时输出值,0:低高平 1:高电平
} USB5630_PORT_CH_PARAM, *PUSB5630_PORT_CH_PARAM;

// IO端口参数USB5630_PORT_CH_PARAM中的nFunction功能选择所使用的选项
#define USB5630_PORT_FUN_DIO			0	// DIO,端口0只能为DIo
#define USB5630_PORT_FUN_CTR			1	// CTR,只有端口1可为CTR功能,
#define USB5630_PORT_FUN_PFIIN			2	// PFI输入
#define USB5630_PORT_FUN_PFIOUT		3	// PFI输出
// 端口1的第0路为CTR时,nFunction[1~3]强制为CTR:P1.0为计数器0时钟输入，P1.1为计数器0门控输入，P1.2为计时器0方向控制，P1.3为计数器0输出信号)
// 端口1的第4路为CTR时,nFunction[1~3]强制为CTR:P1.4为计数器1时钟输入，P1.5为计数器1门控输入，P1.6为计时器1方向控制，P1.7为计数器1输出信号)
// 端口1的0~7对应PFI0~7，端口2的0~7对应PFI8~15

// IO端口参数USB5630_PORT_CH_PARAM中的nDIODir功能选择所使用的选项
#define USB5630_PORT_DIR_DI			0	// DI输入
#define USB5630_PORT_DIR_DO			1	// DO输出

// ############# 端口参数结构体USB5630_PORT_PARAM描述 #############
typedef struct _USB5630_PORT_PARAM // IO端口参数结构体
{
	USB5630_PORT_CH_PARAM CHParam[3]; // 端口通道参数配置
} USB5630_PORT_PARAM, *PUSB5630_PORT_PARAM;
//-----------------------------------

// ############# AI工作参数结构体USB5630_AI_PARAM描述 #############
typedef struct _USB5630_AI_CH_PARAM // AI通道参数结构体
{
	U32 nChannel;			// 通道号[0, 7]，分别表示物理通道号AI0－AI7
	U32 nSampleGain;		// 采样增益，具体放大倍数请参考下面常量定义
	U32 nRefGround;			// 地参考方式

	U32 nReserved0;			// 保留(未用)
	U32 nReserved1;			// 保留(未用)
	U32 nReserved2;			// 保留(未用)
} USB5630_AI_CH_PARAM, *PUSB5630_AI_CH_PARAM;

// AI硬件通道参数USB5630_AI_CH_PARAM中的nSampleGain采样增益放大倍数所使用的选项
#define USB5630_AI_SAMPGAIN_1MULT		0 // 1倍增益
#define USB5630_AI_SAMPGAIN_2MULT		1 // 2倍增益
#define USB5630_AI_SAMPGAIN_4MULT		2 // 4倍增益
#define USB5630_AI_SAMPGAIN_8MULT		3 // 8倍增益

// AI硬件通道参数结构体USB5630_AI_CH_PARAM中的nRefGround参数所使用的地参考选项
#define USB5630_AI_REFGND_RSE			0 // 接地参考单端(Referenced Single Endpoint)
#define USB5630_AI_REFGND_NRSE			1 // 非参考单端(Non Referenced Single Endpoint)
#define USB5630_AI_REFGND_DIFF			2 // 差分(Differential)

typedef struct _USB5630_AI_PARAM // 跟整个AI有关的硬件工作参数(简称AI工作参数)
{
	// 通道参数
	U32 nSampChanCount;     // 采样通道总数[1, 64](此参数在单点采样有效，未此注明的参数则在单点采样模式中无效)
	USB5630_AI_CH_PARAM CHParam[64]; // 通道参数配置(此参数在单点采样有效，未此注明的参数则在单点采样模式中无效)
	U32 nChanScanMode;		// 通道扫描模式，0=通道连续扫描， 1=通道分组扫描
	U32 nGroupLoops;		// 组内循环次数[1, 65535]
	U32 nGroupInterval;     // 组与组之间的时间间隔, 单位：微秒，取值范围[0, 107374182], 等于0时表示等间隔采样(不分组,此时nGroupLoops应等于1)
	U32 nSampleSignal;		// 采样信号(Sample Signal), 详见下面常量定义
	U32 nSampleRange;		// 采样范围(Sample Range)档位选择, 具体见下面常量名定义(此参数在单点采样有效，未此注明的参数则在单点采样模式中无效)

	// 时钟参数
	U32 nSampleMode;		// 采样模式, 0=单点采样(按需), 2=有限点采样, 3=连续采样
	U32 nSampsPerChan;		// 每个通道采样点数(也是每通道待读取点数),取值范围为单点采样模式时应等于1，有限点或连续采样时为[2, 1024*1024/采样通道总数]
	F64 fSampleRate;		// 采样速率(Sample Rate), 单位为sps，取值范围为[1sps, 500000sps],它是每个采样通道的采样速率, 它与nChannelCount的乘积不能大于500000sps
	U32 nClockSource;		// 时钟源选择, 详见下面常量定义
	U32 nClockOutput;		// 采样时钟输出选择, 详见下面常量定义
	U32 nReserved0;			// 保留字段(暂未定义)
	U32 nReserved1;			// 保留字段(暂未定义)
	
	// 开始触发参数
	U32 bDTriggerEn;		// 数字触发DTR允许(Digital Trigger Enable), =FALSE:表示禁止; =TRUE:表示允许,触发信号由连接器CN2上的DIO1复用输入，因此初始化时会将DIO1的方向强制置为输入
	U32 nDTriggerDir;	    // 数字触发方向(Digital Trigger Direction)
	U32 nDTrigChannel;		// DTR触发通道选择,详见下面常量定义
	U32 bATriggerEn;		// 模拟数字触发ATR允许(Analog Trigger Enable), =TRUE:表示允许, =FALSE:表示禁止
	U32 nATriggerDir;		// 模拟触发方向(Analog Trigger Direction)
	F32 fTriggerLevel;		// 触发电平(Trigger Level), 注意：AI跟AO的共用同一个触发电平，故此处改变触发电平也会引起AO的触发电平变化
	U32 nTriggerSens;		// 触发灵敏度(Trigger Sensitive for Digital and Analog trigger),单位：微秒(uS)，取值范围[0, 1638], 注意：AI跟AO的共用同一个触发灵敏度，故此处改变触发灵敏度也会引起AO的触发灵敏度变化
	U32 nDelaySamps;		// 触发延迟点数, 单位：采样点，取值范围32位有效[0, 4294967295]，0:Post Trigger, >0:Delay Trigger
	U32 nReserved2;			// 保留字段(暂未定义)

	// 其他方面
	U32 nReserved3;			// 保留字段(暂未定义)
	U32 nReserved4;			// 保留字段(暂未定义)
	U32 nReserved5;			// 保留字段(暂未定义)
	U32 nReserved6;			// 保留字段(暂未定义)
	U32 nReserved7;			// 保留字段(暂未定义)
} USB5630_AI_PARAM, *PUSB5630_AI_PARAM;

// AI硬件参数结构体USB5630_AI_PARAM中的nChanScanMode扫描模式所使用的选项
#define USB5630_AI_CHAN_SCANMODE_CONTINUOUS	0 // 连续扫描
#define USB5630_AI_CHAN_SCANMODE_GROUP			1 // 分组扫描

// AI硬件参数结构体USB5630_AI_PARAM中的nSampleSignal采样信号所使用的选项
#define USB5630_AI_SAMPSIGNAL_AI			0 // AI通道输入信号
#define USB5630_AI_SAMPSIGNAL_0V			1 // 0V(AGND)
#define USB5630_AI_SAMPSIGNAL_2D5V			2 // 2.5V(DC)
#define USB5630_AI_SAMPSIGNAL_5V			3 // 5V(DC)
#define USB5630_AI_SAMPSIGNAL_AO0			4 // AO0(DC)
#define USB5630_AI_SAMPSIGNAL_AO1			5 // AO1(DC)
#define USB5630_AI_SAMPSIGNAL_AO2			6 // AO2(DC)
#define USB5630_AI_SAMPSIGNAL_AO3			7 // AO3(DC)

// AI硬件参数结构体USB5630_AI_PARAM中的nSampleRange参数所使用的采样范围挡位选项
#define USB5630_AI_SAMPRANGE_N10_P10V		0 // ±10V
#define USB5630_AI_SAMPRANGE_N5_P5V			1 // ±5V
#define USB5630_AI_SAMPRANGE_N2D5_P2D5V		2 // ±2.5V
#define USB5630_AI_SAMPRANGE_0_P10V			3 // 0-10V
#define USB5630_AI_SAMPRANGE_0_P5V			4 // 0-5V

// AI硬件参数结构体USB5630_AI_PARAM中的nSampleMode采样模式所使用的选项
#define USB5630_AI_SAMPMODE_ONE_DEMAND		0 // 软件按需单点采样
#define USB5630_AI_SAMPMODE_FINITE			2 // 有限点采样
#define USB5630_AI_SAMPMODE_CONTINUOUS		3 // 连续采样


// AI硬件参数结构体USB5630_AI_PARAM中的nClockSource时钟源所使用的选项
// AO硬件参数结构体USB5630_AO_PARAM中的nClockSource时钟源所使用的选项
#define USB5630_AIO_CLKSRC_LOCAL			 0 // 本地时钟(通常为本地晶振时钟OSCCLK),也叫内部时钟
#define USB5630_AIO_CLKSRC_PFI00			 1 // PFI00输入时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKSRC_PFI01			 2 // PFI01输入时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKSRC_PFI02			 3 // PFI02输入时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKSRC_PFI03			 4 // PFI03输入时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKSRC_PFI04			 5 // PFI04输入时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKSRC_PFI05			 6 // PFI05输入时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKSRC_PFI06			 7 // PFI06输入时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKSRC_PFI07			 8 // PFI07输入时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKSRC_PFI08			 9 // PFI08输入时钟(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_CLKSRC_PFI09			10 // PFI09输入时钟(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_CLKSRC_PFI10			11 // PFI10输入时钟(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_CLKSRC_PFI11			12 // PFI11输入时钟(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_CLKSRC_PFI12			13 // PFI12输入时钟(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_CLKSRC_PFI13			14 // PFI13输入时钟(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_CLKSRC_PFI14			15 // PFI14输入时钟(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_CLKSRC_PFI15			16 // PFI15输入时钟(时钟输入输出、DIO、DTR触发复用)

// AI硬件参数结构体USB5630_AI_PARAM中的nClockOutput时钟输出所使用的选项
// AO硬件参数结构体USB5630_AO_PARAM中的nClockOutput时钟输出所使用的选项
#define USB5630_AIO_CLKOUT_DISABLE			 0 // 禁止采样时钟输出
#define USB5630_AIO_CLKOUT_PFI00			 1 // PFI00输出时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKOUT_PFI01			 2 // PFI01输出时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKOUT_PFI02			 3 // PFI02输出时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKOUT_PFI03			 4 // PFI03输出时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKOUT_PFI04			 5 // PFI04输出时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKOUT_PFI05			 6 // PFI05输出时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKOUT_PFI06			 7 // PFI06输出时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKOUT_PFI07			 8 // PFI07输出时钟(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_CLKOUT_PFI08			 9 // PFI08输出时钟(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_CLKOUT_PFI09			10 // PFI09输出时钟(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_CLKOUT_PFI10			11 // PFI10输出时钟(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_CLKOUT_PFI11			12 // PFI11输出时钟(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_CLKOUT_PFI12			13 // PFI12输出时钟(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_CLKOUT_PFI13			14 // PFI13输出时钟(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_CLKOUT_PFI14			15 // PFI14输出时钟(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_CLKOUT_PFI15			16 // PFI15输出时钟(时钟输入输出、DIO、DTR触发复用)

// AI硬件参数结构体USB5630_AI_PARAM中的nDTrigChannel DTR触发通道所使用的选项
// AO硬件参数结构体USB5630_AO_PARAM中的nDTrigChannel DTR触发通道所使用的选项
#define USB5630_AIO_DTRIG_PFI00			 0 // PFI00触发(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_DTRIG_PFI01			 1 // PFI01触发(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_DTRIG_PFI02			 2 // PFI02触发(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_DTRIG_PFI03			 3 // PFI03触发(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_DTRIG_PFI04			 4 // PFI04触发(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_DTRIG_PFI05			 5 // PFI05触发(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_DTRIG_PFI06			 6 // PFI06触发(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_DTRIG_PFI07			 7 // PFI07触发(时钟输入输出、DIO、DTR触发、CNT复用)
#define USB5630_AIO_DTRIG_PFI08			 8 // PFI08触发(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_DTRIG_PFI09			 9 // PFI09触发(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_DTRIG_PFI10			10 // PFI10触发(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_DTRIG_PFI11			11 // PFI11触发(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_DTRIG_PFI12			12 // PFI12触发(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_DTRIG_PFI13			13 // PFI13触发(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_DTRIG_PFI14			14 // PFI14触发(时钟输入输出、DIO、DTR触发复用)
#define USB5630_AIO_DTRIG_PFI15			15 // PFI15触发(时钟输入输出、DIO、DTR触发复用)

// AI硬件参数结构体USB5630_AI_PARAM中的nDTriggerDir/nATriggerDir触发方向所使用的选项
#define USB5630_AI_TRIGDIR_FALLING			0 // 下降沿/低电平
#define USB5630_AI_TRIGDIR_RISING			1 // 上升沿/高电平
#define USB5630_AI_TRIGDIR_CHANGE			2 // 变化(即上下边沿/高低电平均有效)

// #################### AI工作状态结构体USB5630_AI_STATUS描述 #####################
typedef struct _USB5630_AI_STATUS
{
	U32 bTaskDone;				// 采集任务完成标志, =TRUE:表示采集任务完成, =FALSE:表示采样未完成，正在进行中
	U32 bTriggered;				// 触发标志, =TRUE:表示已被触发, =FALSE:表示未被触发(即正等待触发)

	U32 nTaskState;				// 采集任务状态, =1:正常, 其它值表示有异常情况
	U32 nAvailSampsPerChan;		// 每通道有效点数，只有它大于当前指定读数长度时才能调用AI_ReadAnalog()立即读取指定长度的采样数据
	U32 nMaxAvailSampsPerChan;	// 自AI_StartTask()后每通道出现过的最大有效点数，状态值范围[0, nBufSampsPerChan],它是为监测采集软件性能而提供，如果此值越趋近于1，则表示意味着性能越高，越不易出现溢出丢点的可能
	U32 nBufSampsPerChan;		// 每通道缓冲区大小(采样点数)。
	I64 nSampsPerChanAcquired;	// 每通道已采样点数(自开始AI_StartTask()之后所采样的点数)，这个只是给用户的统计数据

	U32 nHardOverflowCnt;		// 硬件溢出计数(在不溢出情况下恒等于0)
	U32 nSoftOverflowCnt;		// 软件溢出计数(在不溢出情况下恒等于0)
	U32 nInitTaskCnt;			// 初始化采集任务的次数(即调用AI_InitTask()的次数)
	U32 nReleaseTaskCnt;		// 释放采集任务的次数(即调用AI_ReleaseTask()的次数)
	U32 nStartTaskCnt;			// 开始采集任务的次数(即调用AI_StartTask()的次数)
	U32 nStopTaskCnt;			// 停止采集任务的次数(即调用AI_StopTask()的次数)
	U32 nTransRate;				// 传输速率, 即每秒传输点数(sps)，作为USB及应用软件传输性能的监测信息

	U32 nReserved0;				// 保留字段(暂未定义)
	U32 nReserved1;				// 保留字段(暂未定义)
	U32 nReserved2;				// 保留字段(暂未定义)
	U32 nReserved3;				// 保留字段(暂未定义)
	U32 nReserved4;				// 保留字段(暂未定义)
} USB5630_AI_STATUS, *PUSB5630_AI_STATUS;

// #################### AI主要信息结构体(USB5630_AI_MAIN_INFO) #######################
typedef struct _USB5630_AI_MAIN_INFO
{
	U32 nChannelCount;		// AI通道数量
	U32 nSampRangeCount;	// AI采样范围挡位数量
	U32 nSampGainCount;		// AI采样增益挡位数量
	U32 nCouplingCount;		// AI耦合挡位数量
	U32 nImpedanceCount;	// AI阻抗的挡位数量
	U32 nDepthOfMemory;		// AI板载存储器深度(点数)
	U32 nSampResolution;	// AI采样分辨率(如=8表示8Bit; =12表示12Bit; =14表示14Bit; =16表示16Bit)
	U32 nSampCodeCount;		// AI采样编码数量(如256, 4096, 16384, 65536)
	U32 nTrigLvlResolution;	// 触发电平分辨率(如=8表示8Bit; =12表示12Bit; =16表示16Bit)
	U32 nTrigLvlCodeCount;	// 触发电平编码数量(如256, 4096)

	U32 nReserved0;			// 保留字段(暂未定义)
	U32 nReserved1;			// 保留字段(暂未定义)
	U32 nReserved2;			// 保留字段(暂未定义)
	U32 nReserved3;			// 保留字段(暂未定义)
} USB5630_AI_MAIN_INFO, *PUSB5630_AI_MAIN_INFO;

// #################### AI电压范围信息结构体(USB5630_AI_VOLT_RANGE_INFO) #######################
typedef struct _USB5630_AI_VOLT_RANGE_INFO
{
	U32 nSampleRange;		// 当前采样范围挡位号
	U32 nReserved0;			// 保留字段(暂未定义)
	F64 fMaxVolt;			// 采样范围的最大电压值,单位:伏(V)
	F64 fMinVolt;			// 采样范围的最小电压值,单位:伏(V)
	F64 fAmplitude;			// 采样范围幅度,单位:伏(V)
	F64 fHalfOfAmp;			// 采样范围幅度的二分之一,单位:伏(V)
	F64 fCodeWidth;			// 编码宽度,单位:伏(V), 即每个单位码值所分配的电压值
	F64 fOffsetVolt;		// 偏移电压,单位:伏(V),一般用于零偏校准
	F64 fOffsetCode;		// 偏移码值,一般用于零偏校准,它代表的电压值等价于fOffsetVolt
	char strDesc[16];		// 采样范围字符描述,如"±10V", "0-10V"等

	U32 nPolarity;			// 采样范围的极性(0=双极性BiPolar, 1=单极性UniPolar)
	U32 nCodeCount;			// 原码数量
	I32 nMaxCode;			// 原码最大值
	I32 nMinCode;	        // 原码最小值

	U32 nReserved1;			// 保留字段(暂未定义)
	U32 nReserved2;			// 保留字段(暂未定义)
	U32 nReserved3;			// 保留字段(暂未定义)
	U32 nReserved4;			// 保留字段(暂未定义)
} USB5630_AI_VOLT_RANGE_INFO, *PUSB5630_AI_VOLT_RANGE_INFO;

// 结构体AI_SAMP_RANGE_INFO的数据成员Polarity所用的采样范围极性选项
#define USB5630_AI_POLAR_BIPOLAR	0 // 双极性
#define USB5630_AI_POLAR_UNIPOLAR	1 // 单极性

// #################### AI增益信息结构体(USB5630_AI_SAMP_GAIN_INFO) #######################
typedef struct _USB5630_AI_VOLT_GAIN_INFO
{
	U32 nSampleGain;		// 当前采样增益挡位号
	U32 nReserved0;			// 保留字段(暂未定义)
	F64 fAmpFactor;			// 放大倍数(Amplification Factor)
	char strDesc[16];		// 采样增益字符描述,如"10倍", "100倍"等

	U32 nReserved1;			// 保留字段(暂未定义)
	U32 nReserved2;			// 保留字段(暂未定义)
	U32 nReserved3;			// 保留字段(暂未定义)
	U32 nReserved4;			// 保留字段(暂未定义)
} USB5630_AI_VOLT_GAIN_INFO, *PUSB5630_AI_VOLT_GAIN_INFO;

// #################### AI速率信息结构体(USB5630_AI_SAMP_RATE_INFO) #######################
typedef struct _USB5630_AI_SAMP_RATE_INFO
{
	F64 fMaxRate;		// 单通道最大采样速率(sps)，多通道时各通道平分最大采样率
	F64 fMinRate;		// 单通道最小采样速率(sps)，多通道时各通道平分最小采样率
	F64 fTimerBase;		// 时钟基准（即板载晶振频率）单位：Hz
	U32 nDivideMode;	// 分频模式，0=整数分频(INTDIV), 1=DDS分频(DDSDIV)
	U32 nRateType;		// 速率类型,指fMaxRate和fMinRate的类型, =0:表示为所有采样通道的总速率, =1:表示为每个采样通道的速率

	U32 nReserved0;		// 保留字段(暂未定义)
	U32 nReserved1;		// 保留字段(暂未定义)
} USB5630_AI_SAMP_RATE_INFO, *PUSB5630_AI_SAMP_RATE_INFO;

// ##################### AO工作参数结构体USB5630_AO_PARAM描述 ###################
typedef struct _USB5630_AO_CH_PARAM // AO通道参数结构体
{
	U32 bChannelEn;			// 通道采样允许
	U32 nSampleRange;		// 采样范围，具体定义请参考下面常量定义

	U32 nReserved0;			// 保留(未用)
	U32 nReserved1;			// 保留(未用)
	U32 nReserved2;			// 保留(未用)
	U32 nReserved3;			// 保留(未用)
} USB5630_AO_CH_PARAM, *PUSB5630_AO_CH_PARAM;

// AO硬件参数结构体USB5630_AO_CH_PARAM中的nSampleRange参数所使用的模拟量输入采样范围挡位选项
#define USB5630_AO_SAMPRANGE_0_P5V			0 // 0-5V
#define USB5630_AO_SAMPRANGE_0_P10V			1 // 0-10V
#define USB5630_AO_SAMPRANGE_N5_P5V			2 // ±5V
#define USB5630_AO_SAMPRANGE_N10_P10V		3 // ±10V
#define USB5630_AO_SAMPRANGE_N2D5_P2D5V		4 // ±2.5V
#define USB5630_AO_SAMPRANGE_N2D5_P7D5V		5 // -2.5~7.5V

typedef struct _USB5630_AO_PARAM // 跟整个AO有关的硬件工作参数(简称AO工作参数)
{
	// 通道参数
	USB5630_AO_CH_PARAM CHParam[4]; // 通道参数（通道使能，采样范围）

	// 时钟参数
	U32 nSampleMode;		// 采样模式, 0=单点采样(按需)， 1、硬件定时单点(暂不支持)，2=有限点采样， 3=连续采样
	U32 nSampsPerChan;		// 每个通道生成点数(也是每通道待写入点数),取值范围为单点采样模式时应等于1，有限点或连续采样时为[2, 1024*1024]
	F64 fSampleRate;		// 采样速率(Sample Rate), 单位为sps,取值范围为[1sps, 500000sps],它是每个采样通道的采样速率
	U32 nClockSource;		// 时钟源选择, 详见上面常量定义
	U32 nClockOutput;		// 采样时钟输出选择,详见上面常量定义
	U32 bRegenModeEn;		// 波形重生成模式允许(在连续采样模式中有效), =TRUE:只是对开始前写入任务中的波形点数据进行循环重复生成，=FALSE:禁止重生成模式，在开始后，还要不断的往任务中写入新的波形数据
	U32 nReserved0;			// 保留字段(暂未定义)
	
	// 开始触发参数
	U32 bDTriggerEn;		// 数字触发DTR允许(Digital Trigger Enable), =FALSE:表示禁止; =TRUE:表示允许,触发信号由连接器CN2上的DIO1复用输入，因此初始化时会将DIO1的方向强制置为输入
	U32 nDTriggerDir;	    // 数字触发方向(Digital Trigger Direction)
	U32 nDTrigChannel;		// DTR触发通道选择,详见上面常量定义
	U32 bATriggerEn;		// 模拟数字触发ATR允许(Analog Trigger Enable), =TRUE:表示允许, =FALSE:表示禁止
	U32 nATriggerDir;		// 模拟触发方向(Analog Trigger Direction)
	F32 fTriggerLevel;		// 触发电平(Trigger Level), 注意：AO跟AI的共用同一个触发电平，故此处改变触发电平也会引起AI的触发电平变化
	U32 nTriggerSens;		// 触发灵敏度(Trigger Sensitive for Digital and Analog trigger),单位：微秒(uS)，取值范围[0, 1638], 注意：AO跟AI的共用同一个触发灵敏度，故此处改变触发灵敏度也会引起AI的触发灵敏度变化
	U32 nDelaySamps;		// 触发延迟点数, 单位：采样点，取值范围32位有效[0, 4294967295]，0:Post Trigger, >0:Delay Trigger
	U32 nReserved1;			// 保留字段(暂未定义)

	// 其他参数
	U32 nReserved2;			// 保留字段(暂未定义)
	U32 nReserved3;			// 保留字段(暂未定义)
	U32 nReserved4;			// 保留字段(暂未定义)
	U32 nReserved5;			// 保留字段(暂未定义)
} USB5630_AO_PARAM, *PUSB5630_AO_PARAM;

// AO硬件参数结构体USB5630_AO_PARAM中的nSampleMode采样模式所使用的选项
#define USB5630_AO_SAMPMODE_ONE_DEMAND		0 // 单点采样(按需)
#define USB5630_AO_SAMPMODE_ONE_HWTIMED	1 // 单点采样(硬件定时,Hardware Timed, 本设备暂时不支持)
#define USB5630_AO_SAMPMODE_FINITE			2 // 有限点采样
#define USB5630_AO_SAMPMODE_CONTINUOUS		3 // 连续采样

// AI硬件参数结构体USB5630_AO_PARAM中的nDTriggerDir触发方向所使用的选项
#define USB5630_AO_TRIGDIR_FALLING			0 // 下降沿/低电平
#define USB5630_AO_TRIGDIR_RISING			1 // 上升沿/高电平
#define USB5630_AO_TRIGDIR_CHANGE			2 // 变化(即上下边沿/高低电平均有效)

// #################### AO工作状态结构体USB5630_AO_STATUS描述 #####################
typedef struct _USB5630_AO_STATUS
{
	U32 bTaskDone;				// 生成任务完成标志, =TRUE:表示生成任务完成, =FALSE:表示采样未完成，正在进行中
	U32 bTriggered;				// 触发标志, =TRUE:表示已被触发, =FALSE:表示未被触发(即正等待触发)

	U32 nTaskState;				// 生成任务状态, =1:正常, 其它值表示有异常情况
	U32 nAvailSampsPerChan;		// 可写点数，最好等它大于参数nWriteSampsPerChan时才能调用AO_WriteAnalog()写入采样数据
	U32 nMaxAvailSampsPerChan;	// 自AO_StartTask()后出现过的最大可读点数，状态值范围[0, nBufSampsPerChan],它是为监测采集软件性能而提供，如果此值越趋近于1，则表示意味着性能越高，越不易出现溢出丢点的可能
	U32 nBufSampsPerChan;		// 每通道缓冲区大小(采样点数)。
	U64 nSampsPerChanAcquired;	// 每通道已采样点数(自开始AO_StartTask()之后所采样的点数)，这个只是给用户的统计数据

	U32 nHardUnderflowCnt;		// 硬件缓冲下溢次数(在不下溢情况下恒等于0)
	U32 nSoftUnderflowCnt;		// 软件缓冲下溢次数(在不下溢情况下恒等于0)
	U32 nInitTaskCnt;			// 初始化生成任务的次数(即调用AO_InitTask()的次数)
	U32 nReleaseTaskCnt;		// 释放生成任务的次数(即调用AO_ReleaseTask()的次数)
	U32 nStartTaskCnt;			// 开始生成任务的次数(即调用AO_StartTask()的次数)
	U32 nStopTaskCnt;			// 停止生成任务的次数(即调用AO_StopTask()的次数)
	U32 nTransRate;				// 传输速率, 即每秒传输点数(sps)，作为USB及应用软件传输性能的监测信息

	U32 nReserved0;				// 保留字段(暂未定义)
	U32 nReserved1;				// 保留字段(暂未定义)
	U32 nReserved2;				// 保留字段(暂未定义)
	U32 nReserved3;				// 保留字段(暂未定义)
	U32 nReserved4;				// 保留字段(暂未定义)
} USB5630_AO_STATUS, *PUSB5630_AO_STATUS;

// #################### AO主要信息结构体(USB5630_AO_MAIN_INFO) #######################
typedef struct _USB5630_AO_MAIN_INFO
{
	U32 nChannelCount;		// AO通道数量
	U32 nSampRangeCount;	// AO采样范围挡位数量
	U32 nSampGainCount;		// AO增益挡位数量
	U32 nCouplingCount;		// AO耦合挡位数量
	U32 nImpedanceCount;	// AO阻抗的挡位数量
	U32 nDepthOfMemory;		// AO板载存储器深度(点数)
	U32 nSampResolution;	// AO采样分辨率(如=8表示8Bit; =12表示12Bit; =14表示14Bit; =16表示16Bit)
	U32 nSampCodeCount;		// AO采样编码数量(如256, 4096, 16384, 65536)
	U32 nTrigLvlResolution;	// 触发电平分辨率(如=8表示8Bit; =12表示12Bit; =16表示16Bit)
	U32 nTrigLvlCodeCount;	// 触发电平编码数量(如256, 4096)

	U32 nReserved0;			// 保留字段(暂未定义)
	U32 nReserved1;			// 保留字段(暂未定义)
	U32 nReserved2;			// 保留字段(暂未定义)
	U32 nReserved3;			// 保留字段(暂未定义)
} USB5630_AO_MAIN_INFO, *PUSB5630_AO_MAIN_INFO;

// #################### AO采样范围信息结构体(USB5630_AO_SAMP_RANGE_INFO) #######################
typedef struct _USB5630_AO_VOLT_RANGE_INFO
{
	U32 nSampleRange;		// 当前采样范围挡位号
	U32 nReserved0;			// 保留字段(暂未定义)
	F64 fMaxVolt;			// 采样范围的最大电压值,单位:伏(V)
	F64 fMinVolt;			// 采样范围的最小电压值,单位:伏(V)
	F64 fAmplitude;			// 采样范围幅度,单位:伏(V)
	F64 fHalfOfAmp;			// 采样范围幅度的二分之一,单位:伏(V)
	F64 fCodeWidth;			// 编码宽度,单位:伏(V), 即每个单位码值所分配的电压值
	F64 fOffsetVolt;		// 偏移电压,单位:伏(V),一般用于零偏校准
	F64 fOffsetCode;		// 偏移码值,一般用于零偏校准,它代表的电压值等价于fOffsetVolt
	char strDesc[16];		// 采样范围字符描述,如"±10V", "0-10V"等

	U32 nPolarity;			// 采样范围的极性(0=双极性BiPolar, 1=单极性UniPolar)
	U32 nCodeCount;			// 原码数量
	I32 nMaxCode;			// 原码最大值
	I32 nMinCode;	        // 原码最小值

	U32 nReserved1;			// 保留字段(暂未定义)
	U32 nReserved2;			// 保留字段(暂未定义)
	U32 nReserved3;			// 保留字段(暂未定义)
	U32 nReserved4;			// 保留字段(暂未定义)
} USB5630_AO_VOLT_RANGE_INFO, *PUSB5630_AO_VOLT_RANGE_INFO;

// 结构体AO_SAMP_RANGE_INFO的数据成员Polarity所用的采样范围极性选项
#define USB5630_AO_POLAR_BIPOLAR	0 // 双极性
#define USB5630_AO_POLAR_UNIPOLAR	1 // 单极性

// #################### AO速率信息结构体(USB5630_AO_SAMP_RATE_INFO) #######################
typedef struct _USB5630_AO_SAMP_RATE_INFO
{
	F64 fMaxRate;		// 单通道最大采样速率(sps)，多通道时各通道平分最大采样率
	F64 fMinRate;		// 单通道最小采样速率(sps)，多通道时各通道平分最小采样率
	F64 fTimerBase;		// 时钟基准（即板载晶振频率）单位：Hz
	U32 nDivideMode;	// 分频模式，0=整数分频(INTDIV), 1=DDS分频(DDSDIV)
	U32 nRateType;		// 速率类型,指fMaxRate和fMinRate的类型, =0:表示为所有采样通道的总速率, =1:表示为每个采样通道的速率

	U32 nReserved0;		// 保留字段(暂未定义)
	U32 nReserved1;		// 保留字段(暂未定义)
} USB5630_AO_SAMP_RATE_INFO, *PUSB5630_AO_SAMP_RATE_INFO;

// 结构体AO_SAMP_RANGE_INFO的数据成员Polarity所用的采样范围极性选项
#define USB5630_AO_POLAR_BIPOLAR	0 // 双极性
#define USB5630_AO_POLAR_UNIPOLAR	1 // 单极性

// AO_GetVoltRangeInfo()函数的参数nSampleRange所用的采样范围挡位选项
#define USB5630_AO_SAMPRANGE_FROM_DEVICE 0xFFFFFFFF	// 来自设备当前的采样范围挡位

// ###################### CTR工作参数结构体(USB5630_CTR_PARAM) #######################
typedef struct _USB5630_CTR_PARAM // 跟整个CTR有关的硬件工作参数(简称CTR工作参数)
{
	U32 nGateMode;		// 门控模式(Gate Mode), 其取值范围为[0, 5]
	U32 nInitValue;		// 计数器初始值

	U32 nReserved0;		// 保留字段(暂未定义)
	U32 nReserved1;		// 保留字段(暂未定义)
	U32 nReserved2;		// 保留字段(暂未定义)
	U32 nReserved3;		// 保留字段(暂未定义)
} USB5630_CTR_PARAM, *PUSB5630_CTR_PARAM;

// CTR硬件参数结构体USB5630_CTR_PARAM中的nGateMode门控方式所使用的选项

#define USB5630_CTR_GATEMODE_POSITIVE_0	0	// 计数结束产生中断: GATE高电平时计数，低电平时停止计数，计数时重新写入新的初值，按新值计数
												// 减法计数时，计数到0时OUT为1；

#define USB5630_CTR_GATEMODE_RISING_1		1	// 可编程单拍脉冲：GATE上边沿触发计数，计数中出现GATE上升沿重新装入初值计数, 当写入初值时OUT为1，当开始计数时OUT为0, 减法计数时，计数到0时OUT为1

#define USB5630_CTR_GATEMODE_POSITIVE_2	2	// 频率发生器：GATE高电平时计数，低电平时停止计数，若计数中改变初值，下次有效,计数期间OUT为1, 减法计数时，计数到0后输出一个周期的0，并重新装入计数值计数；

#define USB5630_CTR_GATEMODE_POSITIVE_3	3	// 方波发生器：GATE高电平时计数，低电平时停止计数，若计数中改变初值，下次有效, 计数期间OUT为1, 减法计数时，计数到0后输出一个周期的0，并重新装入计数值计数

#define USB5630_CTR_GATEMODE_POSITIVE_4	4	// 软件触发选通：GATE高电平时计数，低电平时停止计数，若计数中改变初值，本次有效,写
												// 入初值OUT为1, 减法计数时，计数到0后输出一个周期的低电平信号；

#define USB5630_CTR_GATEMODE_RISING_5		5	// 硬件触发选通：GATE上边沿触发计数，计数中出现GATE上升沿重新装入初值计数, 写入初
												// 值OUT为1, 减法计数时，计数到0后输出一个周期的低电平信号；


// ################################ 函数错误信息 ################################
#define ERROR_NO_AVAILABLE_SAMPS	(0xE0000000+1) // 无有效点数
#define ERROR_TASK_FAIL				(0xE0000000+2) // 任务失败
#define ERROR_RATE_OVER_RANGE		(0xE0000000+3)	// 采样速率超限

// ################################ 设备驱动接口申明 ################################
#ifndef _USB5630_DRIVER_
#define DEVLIB __declspec(dllimport)
#else
#define DEVLIB __declspec(dllexport)
#endif

#ifdef __cplusplus
extern "C" {
#endif
	// ################################ DEV设备对象管理函数 ################################
	HANDLE DEVLIB WINAPI USB5630_DEV_Create(					// 创建设备对象句柄(hDevice), 成功返回实际句柄,失败则返回INVALID_HANDLE_VALUE(-1),可调用GetLastError()分析错误原因
										U32 nDeviceIdx,			// 设备序号(逻辑序号或物理序号, 具体使用哪种序号由参数bUsePhysIdx决定)
										BOOL bUsePhysIdx);		// 是否使用物理序号, =TRUE:使用物理序号, =FALSE:使用逻辑序号										

	U32 DEVLIB WINAPI USB5630_DEV_GetCount(void);				// 取得该设备总台数,成功返回值>0, 失败返回0(可调用GetLastError()分析错误原因)

	BOOL DEVLIB WINAPI USB5630_DEV_GetCurrentIdx(				// 获得指定设备中的逻辑序号和物理序号
										HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
										U32* pLgcIdx,			// 返回的逻辑序号
										U32* pPhysIdx);			// 返回的物理序号

	BOOL DEVLIB WINAPI USB5630_DEV_GetSpeed(					// 读取设备连接的USB端口速度, 
										HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
										U32* pSpeed);			// USB接口速度，=1:USB1.0, =2:USB2.0, =3:USB3.0

	BOOL DEVLIB WINAPI USB5630_DEV_Release(HANDLE hDevice);		// 释放设备对象(关键函数)
	
	// ################################ IO端口控制函数 ################################
	BOOL DEVLIB WINAPI USB5630_Port_Config(HANDLE hDevice, PUSB5630_PORT_PARAM pPortParam);	// IO端口配置函数
	
	BOOL DEVLIB WINAPI USB5630_Port_LoadParam(HANDLE hDevice, PUSB5630_PORT_PARAM pPortParam); // 从USB5630.ini中加载Port参数
	BOOL DEVLIB WINAPI USB5630_Port_SaveParam(HANDLE hDevice, PUSB5630_PORT_PARAM pPortParam); // 保存Port参数至USB5630.ini
	BOOL DEVLIB WINAPI USB5630_Port_ResetParam(HANDLE hDevice, PUSB5630_PORT_PARAM pPortParam); // 将当前Port参数复位至出厂值
	// ################################ AI模拟量输入实现函数 ################################
	BOOL DEVLIB WINAPI USB5630_AI_InitTask(				// 初始化AI采集任务(Initialize Task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PUSB5630_AI_PARAM pAIParam, // AI工作参数, 它仅在此函数中决定硬件初始状态和各工作模式,可以事先由AI_VerifyParam()进行参数校验
									HANDLE* pSampEvent);	// 返回采样事件对象句柄,当设备中出现可读数据段时会触发此事件，参数=NULL,表示不需要此事件句柄

    BOOL DEVLIB WINAPI USB5630_AI_StartTask(				// 开始采集任务
									HANDLE hDevice);		// 设备对象句柄,它由DEV_Create()函数创建

    BOOL DEVLIB WINAPI USB5630_AI_SendSoftTrig(			// 发送软件触发事件(Send Software Trigger),软件触发也叫强制触发
									HANDLE hDevice);		// 设备对象句柄,它由DEV_Create()函数创建

	BOOL DEVLIB WINAPI USB5630_AI_GetStatus(HANDLE hDevice, PUSB5630_AI_STATUS pAIStatus);   // 取得AI各种状态

	BOOL DEVLIB WINAPI USB5630_AI_WaitUntilTaskDone(		// 采集任务结束前等待,返回TRUE表示采集任务结束
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									F64 fTimeout);			// 用于等待的时间，单位：秒(S)

	BOOL DEVLIB WINAPI USB5630_AI_ReadAnalog(				// 从采集任务中读取采样数据(电压数据序列)(Read analog data from the task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									F64 fAnlgArray[],		// 模拟数据数组(电压数组),用于返回采样的电压数据，取值区间由各通道采样时的采样范围决定(单位:V)
									U32 nReadSampsPerChan,	// 每通道请求读取的点数(单位：点)
									U32* pSampsPerChanRead,	// 返回每通道实际读取的点数(单位：点), =NULL,表示无须返回
									U32* pAvailSampsPerChan,// 任务中还存在的可读点数, =NULL,表示无须返回
									F64 fTimeout);			// 超时时间，单位：秒(S)

	BOOL DEVLIB WINAPI USB5630_AI_ReadBinary(				// 从采集任务中采样数据(原码数据序列)(Read binary data from the task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									U16 nBinArray[],		// 二进制数据数组（原码数组）,用于返回采样的原码数据，取值区间为[0, 65535]
									U32 nReadSampsPerChan,	// 每通道请求读取的点数(单位：点)
									U32* pSampsPerChanRead,	// 返回每通道实际读取的点数(单位：点), =NULL,表示无须返回
									U32* pAvailSampsPerChan,// 任务中还存在的可读点数, =NULL,表示无须返回
									F64 fTimeout);			// 超时时间，单位：秒(S)

	BOOL DEVLIB WINAPI USB5630_AI_StopTask(HANDLE hDevice);	// 停止采集任务

	BOOL DEVLIB WINAPI USB5630_AI_ReleaseTask(HANDLE hDevice); // 释放采集任务

	// ========================= AI辅助操作函数 =========================
	BOOL DEVLIB WINAPI USB5630_AI_GetMainInfo(				// 获得AI的主要信息
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PUSB5630_AI_MAIN_INFO pMainInfo); // 获得AI主要信息

	BOOL DEVLIB WINAPI USB5630_AI_GetVoltRangeInfo(		// 获得采样范围的各种信息(幅度、分辨率、极性)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel,			// AI物理通道号(由于本设备所有通道共享一个采样范围选择,故恒等于0)
									U32 nSampleRange,		// 采样范围选择[0, 4]
									PUSB5630_AI_VOLT_RANGE_INFO pRangeInfo); // 采样范围信息

	BOOL DEVLIB WINAPI USB5630_AI_GetVoltGainInfo(			// 获得增益的各种信息(幅度、分辨率、极性)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel,			// AI物理通道号[0, 15]
									U32 nSampleGain,		// 增益选择[0, 3]
									PUSB5630_AI_VOLT_GAIN_INFO pGainInfo); // 增益信息

	BOOL DEVLIB WINAPI USB5630_AI_GetRateInfo(				// 获得采样速率信息
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PUSB5630_AI_SAMP_RATE_INFO pRateInfo); // 采样速率信息

	BOOL DEVLIB WINAPI USB5630_AI_ScaleBinToVolt(			// 根据指定采样范围将单个通道的采样原码数据量化成电压数据,返回实际量化的点数
									PUSB5630_AI_VOLT_RANGE_INFO pRangeInfo, // 当前转换数据需要的采样范围信息
									PUSB5630_AI_VOLT_GAIN_INFO pGainInfo,   // 当前转换数据需要的采样增益信息(若于=NULL，表示不使用增益)
									F64 fVoltArray[],		// 电压数据数组,用于返回量化后的电压数据,单位V
									U16 nBinArray[],		// 二进制原码数组,用于传入量化前的原码数据，取值区间为[0, 65535], (单指某个通道的连续数据)
									U32 nScaleSamps,		// 请求量化的采样点数
									U32* pSampsScaled);		// 返回实际量化的采样点数, =NULL,表示无须返回

	BOOL DEVLIB WINAPI USB5630_AI_ScaleVoltToBin(			// 根据指定采样范围将单个通道的电压数据量化成二进制原码数据,返回实际量化的点数
									PUSB5630_AI_VOLT_RANGE_INFO pRangeInfo, // 当前转换数据需要的采样范围信息
									PUSB5630_AI_VOLT_GAIN_INFO pGainInfo,   // 当前转换数据需要的采样增益信息(若于=NULL，表示不使用增益)
									U16 nBinArray[],		// 原码缓冲区,用于返回量化后的原码数据，取值区间为[0, 65535], (单指某个通道的连续数据)
									F64 fVoltArray[],		// 电压缓冲区,用于传入量化前的电压数据,单位V
									U32 nScaleSamps,		// 请求量化的采样点数
									U32* pSampsScaled);		// 返回实际量化的采样点数, =NULL,表示无须返回

	BOOL DEVLIB WINAPI USB5630_AI_VerifyParam(				// 校验AI工作参数(Verify Parameter),建议在初始化AI参数前调用此函数校验各参数合法性
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PUSB5630_AI_PARAM pAIParam);// 待校验的AI工作参数

	BOOL DEVLIB WINAPI USB5630_AI_LoadParam(HANDLE hDevice, PUSB5630_AI_PARAM pAIParam); // 从USB5630.ini中加载AI参数
	BOOL DEVLIB WINAPI USB5630_AI_SaveParam(HANDLE hDevice, PUSB5630_AI_PARAM pAIParam); // 保存AI参数至USB5630.ini
	BOOL DEVLIB WINAPI USB5630_AI_ResetParam(HANDLE hDevice, PUSB5630_AI_PARAM pAIParam); // 将当前AI参数复位至出厂值

	// ################################ AO模拟量输出实现函数 ################################
	BOOL DEVLIB WINAPI USB5630_AO_InitTask(				// 初始化AO采集任务(Initialize Task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PUSB5630_AO_PARAM pAOParam, // AO工作参数, 它仅在此函数中决定硬件初始状态和各工作模式,可以事先由AO_VerifyParam()进行参数校验
									HANDLE* pSampEvent);	// 返回采样事件对象句柄,当设备中出现可读数据段时会触发此事件，参数=NULL,表示不需要此事件句柄

    BOOL DEVLIB WINAPI USB5630_AO_StartTask(				// 开始AO采集任务(Start Task) 
									HANDLE hDevice);		// 设备对象句柄,它由DEV_Create()函数创建

    BOOL DEVLIB WINAPI USB5630_AO_SendSoftTrig(			// 发送软件触发事件(Send Software Trigger),软件触发也叫强制触发
									HANDLE hDevice);		// 设备对象句柄,它由DEV_Create()函数创建

	BOOL DEVLIB WINAPI USB5630_AO_GetStatus(HANDLE hDevice, PUSB5630_AO_STATUS pAOStatus);   // 取得AO各种状态

	BOOL DEVLIB WINAPI USB5630_AO_WaitUntilTaskDone(		// 生成任务结束前等待,返回TRUE表示生成任务结束
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									F64 fTimeout);			// 超时时间，单位：秒(S)

	BOOL DEVLIB WINAPI USB5630_AO_WriteAnalog(				// 向生成任务中写入AO输出的模拟量电压数据(Write analog data to the task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									F64 fAnlgArray[],		// AO0、AO1电压混合缓冲区,存放AO的模拟(电压)数据，取值区间由各通道采样时的采样范围决定(单位:V)
									U32 nWriteSampsPerChan,	// 每通道请求写入的点数(单位：点)
									U32* pSampsPerChanWritten,// 返回每通道实际写入的点数(单位：点), =NULL,表示无须返回
									U32* pAvailSampsPerChan,// 返回当前可写入的采样点数, =NULL,表示无须返回
									F64 fTimeout);			// 超时时间，单位：秒(S)

	BOOL DEVLIB WINAPI USB5630_AO_WriteBinary(				// 向生成任务中写入AO输出的二进制原码数据(Write binary data to the task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									U16 nBinArray[],		// AO0、AO1原码混合缓冲区,用于返回采样的原码数据，取值区间为[0, 4095]
									U32 nWriteSampsPerChan,	// 每通道请求写入的点数(单位：点), =NULL,表示无须返回
									U32* pSampsPerChanWritten,// 返回每通道实际写入的点数(单位：点), =NULL,表示无须返回
									U32* pAvailSampsPerChan,	// 返回当前可写入的采样点数, =NULL,表示无须返回
									F64 fTimeout);			// 超时时间，单位：秒(S)

	BOOL DEVLIB WINAPI USB5630_AO_ReadbackAnalog(			// 回读所有AO通道的当前生成的模拟量数据(电压数据序列)(Read back analog data from the task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									F64 fAnlgArray[4]);		// fAnlgArray[0]=AO0电压数据,fAnlgArray[1]=AO1电压数据,fAnlgArray[2]=AO2电压数据, ,fAnlgArray[3]=AO3电压数据, 取值区间由相应通道的采样范围决定

	BOOL DEVLIB WINAPI USB5630_AO_ReadbackBinary(			// 回读所有AO通道的当前生成的模拟量数据(二进制原码数据序列)(Read back binary data from the task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									U16 nBinArray[4]);		// nBinArray[0]=AO0原码数据,nBinArray[1]=AO1原码数据,nBinArray[2]=AO2原码数据,,nBinArray[3]=AO3原码数据, 取值区间[0, 4095]

	BOOL DEVLIB WINAPI USB5630_AO_StopTask(HANDLE hDevice);// 停止生成任务

	BOOL DEVLIB WINAPI USB5630_AO_ReleaseTask(HANDLE hDevice);// 释放由AO_InitTask()函数初始化并占用的各种资源

	// ========================= AO辅助操作函数 =========================
	BOOL DEVLIB WINAPI USB5630_AO_GetMainInfo(				// 获得AO的主要信息
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PUSB5630_AO_MAIN_INFO pMainInfo); // 获得AO主要信息

	BOOL DEVLIB WINAPI USB5630_AO_GetVoltRangeInfo(		// 获得采样范围的各种信息(幅度、分辨率、极性)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel,			// AO物理通道号[0, 3]
									U32 nSampleRange,		// 由用户指定的采样范围挡位号[0, 5],若=AO_SAMPRANGE_FROM_DEVICE(0xFFFFFFFF),表示依据设备当前的挡位号取得采样范围信息
									PUSB5630_AO_VOLT_RANGE_INFO pRangeInfo); // 采样范围信息

	BOOL DEVLIB WINAPI USB5630_AO_GetRateInfo(				// 获得采样速率信息
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PUSB5630_AO_SAMP_RATE_INFO pRateInfo); // 采样速率信息

	BOOL DEVLIB WINAPI USB5630_AO_ScaleBinToVolt(			// 根据指定采样范围将单个通道的采样原码数据量化成电压数据,返回实际量化的点数
									PUSB5630_AO_VOLT_RANGE_INFO pRangeInfo, // 当前转换数据需要的采样范围信息
									F64 fVoltArray[],		// 电压缓冲区,用于返回量化后的电压数据,单位V
									U16 nBinArray[],		// 二进制原码缓冲区,用于传入量化前的原码数据，取值区间为[0, 4095], (单指某个通道的连续数据)
									U32 nScaleSamps,		// 请求量化的采样点数
									U32* pSampsScaled);		// 返回实际量化的采样点数

	BOOL DEVLIB WINAPI USB5630_AO_ScaleVoltToBin(			// 根据指定采样范围将单个通道的电压数据量化成采样原码数据,返回实际量化的点数
									PUSB5630_AO_VOLT_RANGE_INFO pRangeInfo,
									U16 nBinArray[],		// 原码缓冲区,用于返回量化后的原码数据，取值区间为[0, 4095], (单指某个通道的连续数据)
									F64 fVoltArray[],		// 电压缓冲区,用于传入量化前的电压数据,单位V
									U32 nScaleSamps,		// 请求量化的采样点数
									U32* pSampsScaled);		// 返回实际量化的采样点数

	BOOL DEVLIB WINAPI USB5630_AO_VerifyParam(					// 校验AO工作参数(Verify Parameter),建议在初始化AO参数前调用此函数校验各参数合法性
									HANDLE hDevice,				// 设备对象句柄,它由DEV_Create()函数创建
									PUSB5630_AO_PARAM pAOParam);// 待校验的AO工作参数

	BOOL DEVLIB WINAPI USB5630_AO_LoadParam(HANDLE hDevice, PUSB5630_AO_PARAM pAOParam); // 从USB5630.ini中加载AO参数
	BOOL DEVLIB WINAPI USB5630_AO_SaveParam(HANDLE hDevice, PUSB5630_AO_PARAM pAOParam); // 保存AO参数至USB5630.ini
	BOOL DEVLIB WINAPI USB5630_AO_ResetParam(HANDLE hDevice, PUSB5630_AO_PARAM pAOParam); // 将当前AO参数复位至出厂值

	// ############################ CTR计数器函数 ############################
	BOOL DEVLIB WINAPI USB5630_CTR_InitTask(			// 初始采集任务
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel,		// 通道号(本设备有2个通道,取值范围[0,1])
									PUSB5630_CTR_PARAM pCTRParam); // 工作参数

	BOOL DEVLIB WINAPI USB5630_CTR_StartTask(			// 开始采集任务
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel);		// 通道号(本设备有2个通道,取值范围[0,1])

    BOOL DEVLIB WINAPI USB5630_CTR_ReadCounter(			// 读取计数器的当前计数值
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel,		// 通道号(本设备有2个通道,取值范围[0,1])
									U32* pCountVal);	// 计数值

	BOOL DEVLIB WINAPI USB5630_CTR_StopTask(			// 停止(或暂停)采集任务
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel);		// 通道号(本设备有2个通道,取值范围[0,1])

	BOOL DEVLIB WINAPI USB5630_CTR_ReleaseTask(			// 释放采集任务
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel);		// 通道号(本设备有2个通道,取值范围[0,1])

	// ############################ DIO数字量输入输出实现函数 ############################
	BOOL DEVLIB WINAPI USB5630_DIO_ReadPort(			// 读数字量端口值(Read Port Data from DI Port)
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nPort,			// 端口号, 取值范围为[0,2]
									U32* pPortData);	// 返回的端口数据, 有效位Bit[7:0], 读Port0时为DI输入，读Port1时为DO回读

    BOOL DEVLIB WINAPI USB5630_DIO_WritePort(			// 写数字量端口值(Write Port Data to DO Port)
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nPort,			// 端口号, 取值范围为[0,2]
									U32 nPortData);		// 端口数据, 有效位Bit[7:0]

	BOOL DEVLIB WINAPI USB5630_DIO_ReadLines(			// 读数字量端口多线值(Read Mult Lines Data from the DI Port)
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nPort,			// 端口号, 取值范围为[0,2]
									U32 bLineDataArray[8]);// 线数据缓冲区, 同时返回端口中各线的状态值bLineDataArray[n]=0:表示关(或低)状态, =1表示开(或高)状态

    BOOL DEVLIB WINAPI USB5630_DIO_WriteLines(			// 写数字量端口值(Write Mult Lines Data to the Digital Port)
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nPort,			// 端口号, 取值范围为[0,2]
									U32 bLineDataArray[8]); // 线数据缓冲区, 端口中各线的状态值bLineDataArray[n]=0:表示关(或低)状态, =1表示开(或高)状态

    BOOL DEVLIB WINAPI USB5630_DIO_ReadLine(			// 读线值(Readback Single Line Data from the DI Port)
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nPort,			// 端口号, 取值范围为[0,2]
									U32 nLine,			// 线号[0, 7]
									U32* pLineData);	// 线数据, 取值0或1 

    BOOL DEVLIB WINAPI USB5630_DIO_WriteLine(			// 写线值(Write Single Line Data to DO Port)
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nPort,			// 端口号, 取值范围为[0,2]
									U32 nLine,			// 线号[0, 7]
									U32 bLineData);		// 线值,取值0或1

#ifdef __cplusplus
}
#endif

#ifndef _CVIDEF_H
	// 自动包含驱动函数导入库
	#ifndef _USB5630_DRIVER_
		#ifndef LOAD_USB5630_LIB // 如果没有加载LIB库
			#define LOAD_USB5630_LIB
			#pragma comment(lib, "USB5630.lib")
			#pragma message("Welcome to use ART products!")
			#pragma message("Linked with USB5630.lib successfully!")
			#pragma message("Linked with USB5630.dll successfully!")
		#endif // LOAD_USB5630_LIB
	#endif // _USB5630_DRIVER_
#endif // _CVIDEF_H

#endif // _USB5630_DEVICE_